
package com.irdstudio.efp.esb.api.rest.hj;

import java.util.Objects;

import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.irdstudio.basic.framework.core.exception.BizException;
import com.irdstudio.basic.framework.core.exception.ESBException;
import com.irdstudio.basic.framework.core.util.DateTool;
import com.irdstudio.basic.framework.core.util.StringUtil;
import com.irdstudio.basic.framework.core.util.UUIDUtil;
import com.irdstudio.efp.cus.service.facade.CusIndivCreatesProInfoService;
import com.irdstudio.efp.cus.service.vo.CusIndivCreatesProInfoVO;
import com.irdstudio.efp.esb.api.bean.hj.ReqBdLoanCustomsDocumentNoticeBean;
import com.irdstudio.efp.esb.api.bean.hj.RespBdLoanCustomsDocumentNoticeBean;
import com.irdstudio.efp.esb.api.common.EsbRespServiceBeanCreator;
import com.irdstudio.efp.esb.common.constant.EsbBizEnums;
import com.irdstudio.efp.esb.common.constant.EsbSysHeadEnums;
import com.irdstudio.efp.esb.common.server.req.EsbReqServiceBean;
import com.irdstudio.efp.esb.common.server.resp.EsbRespServiceBean;

/**
 * TODO
 * 
 * @author weijj
 * @since 2019年4月25日 下午3:17:57
 * @version 1.0
 */

@RestController
@RequestMapping("/esb")
public class BdLoanCustomsDocumentNoticeController {

	private static Logger logger = LoggerFactory.getLogger(BdLoanCustomsDocumentNoticeController.class);

	// 客户建档结果过程信息表服务
	@Autowired
	@Qualifier("cusIndivCreatesProInfoService")
	private CusIndivCreatesProInfoService cusIndivCreatesProInfoService;

	/**
	 * 获取ESB请求对象，校验 ESB请求系统头和请求应用头对象
	 * 
	 * @param request
	 *            请求对象集合
	 * @return 0.1: weijj:2019年4月25日 下午3:17:57:TODO <br>
	 * @author weijj
	 * @since 2019年4月25日 下午3:17:57
	 * @date 2019年4月25日 下午3:17:57
	 * @version 0.1
	 */
	@ModelAttribute("esbReqServiceBean")
	public EsbReqServiceBean getReqEsbHeadBean(HttpServletRequest request) {
		logger.info("获取ESB请求对象，校验 ESB请求系统头和请求应用头对象开始");
		EsbReqServiceBean esbReqServiceBean = (EsbReqServiceBean) request.getAttribute("esbReqServiceBean");
		return esbReqServiceBean;
	}

	/**
	 * 获取ESB请求对象，校验 ESB请求体对象
	 * 
	 * @param request
	 *            请求对象集合
	 * @return 0.1: weijj:2019年4月25日 下午3:17:57:TODO <br>
	 * @author weijj
	 * @since 2019年4月25日 下午3:17:57
	 * @date 2019年4月25日 下午3:17:57
	 * @version 0.1
	 */
	@ModelAttribute("reqBdLoanCustomsDocumentNoticeBean")
	public ReqBdLoanCustomsDocumentNoticeBean getReqEsbBodyBean(HttpServletRequest request) {
		logger.info("校验 ESB请求体对象！");
		String esbReqBody = (String) request.getAttribute("esbReqBody");
		return JSONObject.parseObject(esbReqBody, ReqBdLoanCustomsDocumentNoticeBean.class);
	}

	/**
	 * 批量客户建档处理结果通知接口
	 * 
	 * 0.1: weijj:2019年4月25日 下午3:17:57:TODO <br>
	 * 
	 * @author weijj
	 * @since 2019年4月25日 下午3:17:57
	 * @date 2019年4月25日 下午3:17:57
	 * @version 0.1
	 */
	@PostMapping("/SERVICE_50120004_02")
	public EsbRespServiceBean doRecv(@Validated @ModelAttribute("esbReqServiceBean") EsbReqServiceBean esbReqServiceBean, BindingResult br1,
			@Validated @ModelAttribute("reqBdLoanCustomsDocumentNoticeBean") ReqBdLoanCustomsDocumentNoticeBean reqBdLoanCustomsDocumentNoticeBean,
			BindingResult br2, Exception exception) throws Exception {
		try {
			logger.error("批量客户建档结果回调通知："+JSONObject.toJSONString(esbReqServiceBean));
			// 1.通过切面校验进件申请参数是否正确，如不正确则返回错误信息
			if (Objects.nonNull(exception)) {
				throw exception;
			}
			// ChanFlg 渠道标志
			String chanFlg = reqBdLoanCustomsDocumentNoticeBean.getChanFlg();
			// FlTp 文件类型
			String flTp = reqBdLoanCustomsDocumentNoticeBean.getFlTp();
			// OCMFlPth 文件路径
			String oCMFlPth = reqBdLoanCustomsDocumentNoticeBean.getFlPth();

			// 客户建档结果过程信息
			CusIndivCreatesProInfoVO inCusIndivCreatesProInfoVo = new CusIndivCreatesProInfoVO();
			// serno 流水号
			inCusIndivCreatesProInfoVo.setSerno(UUIDUtil.getUUID());
			// chan_flg 渠道标志
			inCusIndivCreatesProInfoVo.setChanFlg(chanFlg);
			// fltp 文件类型
			inCusIndivCreatesProInfoVo.setFltp(flTp);
			// ocm_flpth 文件路径
			inCusIndivCreatesProInfoVo.setOcmFlpth(oCMFlPth);
			// txn_dt 交易日期
			int indexOut = oCMFlPth.indexOf(".");
			try {
				String txnDt = oCMFlPth.substring(indexOut + 1, indexOut + 9);
				if (!StringUtil.isNullorBank(txnDt)) {
					inCusIndivCreatesProInfoVo.setTxnDt(txnDt);
				} else {
					inCusIndivCreatesProInfoVo.setTxnDt(esbReqServiceBean.getSysHead().getTxnDt());
				}
			} catch (Exception e) {
				logger.error("设置批量客户建档结果过程信息校验日期失败！");
			}
			// state 状态
			inCusIndivCreatesProInfoVo.setState("0");
			// create_time 创建时间
			inCusIndivCreatesProInfoVo.setCreateTime(DateTool.getCurrentDateTime());
			// last_modify_time 最近修改时间
			inCusIndivCreatesProInfoVo.setLastModifyTime(DateTool.getCurrentDateTime());
			// 新增客户建档结果过程信息
			int num = cusIndivCreatesProInfoService.insertCusIndivCreatesProInfo(inCusIndivCreatesProInfoVo);
			if (num == -1) {
				throw new BizException("新增客户建档结果过程信息出错！");
			}
			logger.error("新增客户建档结果过程信息成功："+JSONObject.toJSONString(esbReqServiceBean));
			return EsbRespServiceBeanCreator.buildesbRespServiceBean(esbReqServiceBean,
					JSON.toJSONString(buildBdLoanCustomsDocumentNoticeBean(EsbBizEnums.RetCodeEnum.SUCCESS.getVALUE(),
							EsbBizEnums.RetCodeMsg.SUCCESS_MSG.VALUE)),
					EsbSysHeadEnums.RetStEnum.SUCCESS.getCode(), EsbBizEnums.RetCodeEnum.SUCCESS.getVALUE(),
					EsbBizEnums.RetCodeMsg.SUCCESS_MSG.VALUE);
		} catch (ESBException e) {
			logger.error("批量客户建档处理结果通知接口出错！" + e.getMessage());
			e.printStackTrace();
			return EsbRespServiceBeanCreator.buildesbRespServiceBean(esbReqServiceBean,
					buildBdLoanCustomsDocumentNoticeBean(EsbBizEnums.RetCodeEnum.FAILURE.getVALUE(), e.getMessage()).toString(),
					EsbSysHeadEnums.RetStEnum.FAILURE.getCode(), EsbBizEnums.RetCodeEnum.FAILURE.getVALUE(), e.getMessage());
		} catch (Exception e) {
			logger.error("批量客户建档处理结果通知接口出错！" + e.getMessage());
			return EsbRespServiceBeanCreator.buildesbRespServiceBean(esbReqServiceBean,
					JSON.toJSONString(buildBdLoanCustomsDocumentNoticeBean(EsbBizEnums.RetCodeEnum.FAILURE.getVALUE(), e.getMessage())),
					EsbSysHeadEnums.RetStEnum.FAILURE.getCode(), EsbBizEnums.RetCodeEnum.FAILURE.getVALUE(), e.getMessage());
		}
	}

	/**
	 * 批量客户建档处理结果通知接口的返回对象
	 * 
	 * @param retStCd
	 *            返回状态码
	 * @param rtnMsg
	 *            返回信息
	 * @return
	 * @author weijj
	 * @since 2019年4月25日 下午3:17:57
	 * @version 1.0
	 */
	private static RespBdLoanCustomsDocumentNoticeBean buildBdLoanCustomsDocumentNoticeBean(String retStCd, String rtnMsg) {
		RespBdLoanCustomsDocumentNoticeBean respBean = new RespBdLoanCustomsDocumentNoticeBean();
		respBean.setRetCd(retStCd);
		respBean.setRetMsg(rtnMsg);
		return respBean;
	}
}
